#let code-color = rgb("#F7F7F7")

#set page(width: 585pt, height: auto, margin: (x: 15pt, y: 12pt+32pt))
#set text(size: 12pt, fill: rgb("#333"), font: "Microsoft Sans Serif")

#let Chapter(name, body) = {
  name + body
}

#show figure: set text(size: 9.75pt, fill: rgb("#909090"))
#show par: set block(above: 18pt)
#show heading: it => {
  set block(above: 42pt)
  set text(
    font: "Fira Sans",
    weight: 500,
    size: 18pt - ((it.level - 1) * 3pt)
  )
  it
}

#show raw.where(
  block: false
): box.with(
  fill: code-color,
  radius: 3pt,
  inset: (x: 4.5pt, y: 0pt),
  outset: (y: 2.25pt)
)
#show raw.where(
  block: true
): set block(
  width: 100%, 
  fill: code-color, 
  inset: 15pt,
  radius: 3pt
)

#show quote.where(block: true): it => {
  table(
    stroke: none,
    columns: (auto, auto),
    table.vline(stroke: 3pt + rgb("#548EAA")),
    pad(x: 15pt, it.body)
  )
}

= Пишем калькулятор на Rust с GUI

Зачем еще один калькулятор? Да незачем, просто как тестовый проект для рассмотрения GUI-библиотеки.

Изначально я хотел попробовать такие крейты, как GPUI, Floem и Xilem, но первая, кажется, пока работает только под MacOS и Linux, вторая не позволяет установить иконку окну и кушает оперативы побольше Webview в Tauri, а до третьей я так и не добрался, узнав об Slint.

Об Slint есть всего несколько новостных постов на Хабре, поэтому, возможно, вам будет интересно посмотреть, что это такое.

== Об Slint

Slint — это GUI-фреймворк, который, по заявлениям разработчиков, выделяется своей компактностью и легкостью использования. Сравниваясь с конкурентами, разработчики Slint утверждают, что их рантайм занимает всего 300 кб в оперативной памяти, что делает его идеальным выбором для embedded-систем.

Фреймворк официально поддерживает Rust, C++ и Node.js, и предоставляет собственный DSL, который затем  компилируется в нативный код перечисленных языков и платформы. DSL представляет из себя некую смесь CSS и SwiftUI, что делает точку входа значительно ниже.

Разработчики проекта предоставляют #link("https://slint.dev/get-started#integrate-with-ides")[плагины] для популярных и не очень IDE и редакторов кода, который даёт нам щепотку intellisense и немного кривой превью, который не может нормально отработать свойства `default-font-*`. Рекомендую к этому накатить ещё #link("https://codeium.com/")[Codeium], у них есть бета-поддержка Slint DSL (хотя на чудо рассчитывать не нужно).

Slint распространяется под несколькими лицензиями.

#image("images/licenses.png")

== Создаём проект
Для тех, кто мало знаком с Rust, буду всё подробно расписывать (ну, установить-то инфраструктуру языка, наверное, и без меня сможете, да? Да, ведь?...). Поэтому... создаём проект! Это делается следующими командами:

```bash
cargo new
# или
cargo init
```
По сути, обе команды делают одно и то же, но для cargo new нужно обязательно указать имя новой директории. Но если для cargo init не указать название, она создаст проект в текущей директории.

#quote(block: true)[Если Вам не нужен локальный репозиторий, который создаётся при инициализации проекта, стоит использовать флаг `--vcs none`.]

В нашем случае проект будет носить название `calc-rs`. Воспользовавшись командой, получаем проект со следующей структурой:

#figure(
  image("images/project.png"),
  caption: "Структура проекта",
  supplement: none
)